//有一幅以 m x n 的二维整数数组表示的图画 image ，其中 image[i][j] 表示该图画的像素值大小。 
//
// 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。 
//
// 为了完成 上色工作 ，从初始像素开始，记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点，接着再记录这四个方向上符合条件的像素点与他们对
//应 四个方向上 像素值与初始坐标相同的相连像素点，……，重复该过程。将所有有记录的像素点的颜色值改为 newColor 。 
//
// 最后返回 经过上色渲染后的图像 。 
//
// 
//
// 示例 1: 
//
// 
//
// 
//输入: image = [[1,1,1],[1,1,0],[1,0,1]]，sr = 1, sc = 1, newColor = 2
//输出: [[2,2,2],[2,2,0],[2,0,1]]
//解析: 在图像的正中间，(坐标(sr,sc)=(1,1)),在路径上所有符合条件的像素点的颜色都被更改成2。
//注意，右下角的像素没有更改为2，因为它不是在上下左右四个方向上与初始点相连的像素点。
// 
//
// 示例 2: 
//
// 
//输入: image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, newColor = 2
//输出: [[2,2,2],[2,2,2]]
// 
//
// 
//
// 提示: 
//
// 
// m == image.length 
// n == image[i].length 
// 1 <= m, n <= 50 
// 0 <= image[i][j], newColor < 2¹⁶ 
// 0 <= sr < m 
// 0 <= sc < n 
// 
// Related Topics深度优先搜索 | 广度优先搜索 | 数组 | 矩阵 
//
// 👍 374, 👎 0 
//
//
//
//

package leetcode.editor.cn;

import com.sun.org.apache.bcel.internal.generic.ACONST_NULL;
import javafx.util.Pair;

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;

class FloodFill {
    public static void main(String[] args) {
        Solution solution = new FloodFill().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        // DFS
        // 官解另一种写法：使用方向数组 https://leetcode.cn/problems/flood-fill/solution/tu-xiang-xuan-ran-by-leetcode-solution/
        /*public int[][] floodFill(int[][] image, int sr, int sc, int color) {
            dfs(image, sr, sc, image[sr][sc], color);
            return image;
        }

        public void dfs(int[][] image, int i, int j, int original, int color) {
            if (i < 0 || j < 0 || i >= image.length || j >= image[0].length || image[i][j] != original || image[i][j] == color)
                return;
            image[i][j] = color;
            dfs(image, i + 1, j, original, color);
            dfs(image, i - 1, j, original, color);
            dfs(image, i, j + 1, original, color);
            dfs(image, i, j - 1, original, color);
        }*/

        // BFS
        int[][] dirs = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

        public int[][] floodFill(int[][] image, int sr, int sc, int color) {
            int tar = image[sr][sc];
            if (tar == color) return image;
            Queue<int[]> queue = new LinkedList<>();
            queue.offer(new int[]{sr, sc});
            image[sr][sc] = color;
            while (!queue.isEmpty()) {
                int[] poll = queue.poll();
                for (int[] dir : dirs) {
                    int x = poll[0] + dir[0];
                    int y = poll[1] + dir[1];
                    if (x < 0 || y < 0 || x >= image.length || y >= image[0].length || image[x][y] != tar) continue;
                    image[x][y] = color;
                    queue.offer(new int[]{x, y});
                }
            }

            return image;
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}
